package library.admin.response;

import library.admin.constant.ResponseStatus;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;

import java.io.Serializable;

/**
 * 响应实体类
 *
 * 
 *
 */
@Data
@Builder
@ApiModel(value = "ResponseResult",description = "响应实体类")
public class ResponseResult<T> {

    @ApiModelProperty("响应时间戳")
    private long timestamp;

    @ApiModelProperty("响应状态码")
    private String status;

    @ApiModelProperty("响应描述")
    private String message;


    @ApiModelProperty("返回的数据体")
    private T data;

    /**
     * 成功地请求返回包装器
     *
     * @param <T> 数据体对象
     * @return 请求返回的结果
     */
    public static <T> ResponseResult<T> success() {
        return success(null);
    }

    /**
     * 成功地请求返回包装器
     *
     * @param data 返回的数据对象
     * @param <T>  数据对象类型
     * @return 请求返回的结果
     */
    public static <T> ResponseResult<T> success(T data) {
        return ResponseResult.<T>builder().data(data)
                .message(ResponseStatus.SUCCESS.getDescription())
                .status(ResponseStatus.SUCCESS.getResponseCode())
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * 失败地请求返回包装器
     *
     * @param message 请求失败的原因
     * @param <T>     数据对象类型
     * @return 请求返回的结果
     */
    public static <T extends Serializable> ResponseResult<T> fail(String message) {
        return fail(null, message);
    }

    /**
     * 失败地请求返回包装器
     *
     * @param data    返回的数据对象
     * @param message 请求失败的原因
     * @param <T>     数据对象类型
     * @return 请求返回的结果
     */
    public static <T> ResponseResult<T> fail(T data, String message) {
        return ResponseResult.<T>builder().data(data)
                .message(message)
                .status(ResponseStatus.FAIL.getResponseCode())
                .timestamp(System.currentTimeMillis())
                .build();
    }
}
